package com.wmwj.hxlj.mapper;

import com.wmwj.hxlj.entity.Article;
import com.wmwj.hxlj.utils.Result;
import org.apache.ibatis.annotations.*;

import java.util.Date;
import java.util.List;

@Mapper
public interface ArticleMapper {

    @Insert("INSERT INTO article (title, content, author_id, tag, category_id, views, likes, favorites, comments_count, create_time, update_time, status, is_top) " +
            "VALUES (#{title}, #{content}, #{authorId}, #{tag}, #{categoryId}, #{views}, #{likes}, #{favorites}, #{commentsCount}, #{createTime}, #{updateTime}, #{status}, #{isTop})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Article article);

    // 查询操作
    @Select("SELECT * FROM article WHERE id = #{id}")
    Article findById(Long id);

    // 查询所有文章
    @Select("SELECT * FROM article")
    List<Article> findAll();

    // 更新操作
    @Update("UPDATE article SET title = #{title}, content = #{content}, " +
            "tag = #{tag}, category_id = #{categoryId}, " +
            "update_time = #{updateTime}, " +
            "status = #{status} WHERE id = #{id}")
    int update(Article article);

    // 删除操作(软删除）
//    @Delete("DELETE FROM article WHERE id = #{id}")
    @Update("UPDATE article SET status = 0, update_time = #{updateTime} WHERE id = #{id}")
    int deleteById(Long id, Date updateTime);

    // 更新文章状态
    @Update("UPDATE article SET status = #{status}, update_time = #{updateTime} WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("updateTime") Date updateTime);

    // 根据关键词搜索文章，关键词可以是文章标题或内容的一部分
    @Select("SELECT * FROM article WHERE title LIKE CONCAT('%', #{keyword}, '%')"+
            " OR content LIKE CONCAT('%', #{keyword}, '%') LIMIT #{pageStart},#{pageSize}")
    List<Article> searchByKeyword(String keyword, int pageStart, int pageSize);

    // 根据类别ID查找文章
    @Select("SELECT * FROM article WHERE category_id = #{categoryId} LIMIT #{pageStart},10")
    List<Article> findByCategoryId(Long categoryId, int pageStart);

    /**
     * 通过标签名查询相关标签下的文章
     * @param tag
     * @return
     */
    @Select("SELECT * FROM article WHERE tag LIKE CONCAT('%', #{tag}, '%')")
    List<Article> findByTag(String tag);

    // 高级搜索功能，可以根据关键词、类别ID、标签ID列表、排序字段和排序顺序进行搜索
    @Select("<script>" +
            "SELECT DISTINCT a.* FROM article a " +
            "LEFT JOIN article_tag at ON a.id = at.article_id " +
            "WHERE 1=1 " +
            "<if test='keyword != null and keyword != \"\"'>" +
            "AND (a.title LIKE CONCAT('%', #{keyword}, '%') OR a.content LIKE CONCAT('%', #{keyword}, '%')) " +
            "</if>" +
            "<if test='categoryId != null'>" +
            "AND a.category_id = #{categoryId} " +
            "</if>" +
            "<if test='tagIds != null and tagIds.size() > 0'>" +
            "AND at.tag_id IN " +
            "<foreach item='tagId' index='index' collection='tagIds' open='(' separator=',' close=')'>" +
            "#{tagId}" +
            "</foreach>" +
            "</if>" +
            "ORDER BY ${sortBy} ${sortOrder}" +
            "</script>")
    List<Article> advancedSearch(@Param("keyword") String keyword,
                                 @Param("categoryId") Long categoryId,
                                 @Param("tagIds") List<Long> tagIds,
                                 @Param("sortBy") String sortBy,
                                 @Param("sortOrder") String sortOrder);


    /**
     * 增加文章的浏览量
     * @param id 文章ID
     * @return 影响的行数
     */
    @Update("UPDATE article SET views = views + 1 WHERE id = #{id}")
    int incrementViews(Long id);


    /**
     * 增加文章的收藏数
     * @param id 文章ID
     * @return 影响的行数
     */
    @Update("UPDATE article SET favorites = favorites + 1 WHERE id = #{id}")
    int incrementFavorites(Long id);

    /**
     * 更新文章的置顶状态
     * @param id 文章ID
     * @param isTop 置顶状态
     * @return 影响的行数
     */
    @Update("UPDATE article SET is_top = #{isTop} WHERE id = #{id}")
    int updateTopStatus(@Param("id") Long id, @Param("isTop") Boolean isTop);

    /**
     * 根据作者ID获取文章列表
     * @param authorId 作者ID
     * @param pageStart 页码
     * @param pageSize 每页数量
     * @return 文章列表
     */
    @Select("SELECT * FROM article WHERE author_id = #{authorId}"+
            " ORDER BY create_time DESC LIMIT #{pageStart},#{pageSize}")
    List<Article> findByAuthorId(@Param("authorId") Long authorId,@Param("pageStart")  int pageStart, @Param("pageSize")int pageSize);

    /**
     * 根据状态获取文章列表
     * @param status 文章状态
     * @return 文章列表
     */
    @Select("SELECT * FROM article WHERE status = #{status}")
    List<Article> findByStatus(Integer status);

    /**
     * 根据作者ID获取草稿文章列表
     * @param authorId 作者ID
     * @return 草稿文章列表
     */
    @Select("SELECT * FROM article WHERE status = 0 AND author_id = #{authorId}")
    List<Article> findDraftArticlesByUserId(Long authorId);

    /**
     * 获取最新的文章列表
     * @param limit 限制数量
     * @param offset 偏移量
     * @return 文章列表
     */
    @Select("SELECT * FROM article ORDER BY create_time DESC LIMIT #{limit} OFFSET #{offset}")
    List<Article> findLatestArticles(@Param("limit") int limit, @Param("offset") int offset);

    /**
     * 统计所有文章的数量
     * @return 文章数量
     */
    @Select("SELECT COUNT(*) FROM article ")
    int countAllArticles();

    /**
     * 根据状态分页获取文章列表
     * @return 文章列表
     */
    @Select("SELECT * FROM article LIMIT #{pageStart}, #{pageSize}")
    List<Article> selectAllArticles(@Param("pageStart") int pageStart, @Param("pageSize") int pageSize);

    /**
     * 增加文章的评论数
     * @param articleId 文章ID
     * @return 影响的行数
     */
    @Update("UPDATE article SET comments_count = comments_count + 1 WHERE id = #{articleId}")
    void incrementCommentsCount(Long articleId);

    /**
     * 点赞文章
     * @param id 文章ID
     * @return 影响的行数
     */
    @Update("UPDATE article SET likes = likes + 1 WHERE id = #{id}")
    int likeArticle(Long id);

    /**
     * 取消点赞文章
     */
    @Update("UPDATE article SET likes = likes - 1 WHERE id = #{id}")
    int unlikeArticle(Long id);

    /**
     * 取消收藏收藏文章(软删除)
     * @param resourceId 文章ID
     */
    @Update("UPDATE article SET favorites = favorites - 1 WHERE id = #{resourceId}")
    int decrementFavorites(Long resourceId);

    /**
     * 根据文章ID集合查询文章列表
     * @param ids 文章ID集合
     * @return 文章列表
     */
    @Select("<script>" +
            "SELECT * FROM article " +
            "WHERE id IN " +
            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>" +
            "#{id}" +
            "</foreach>" +
            "</script>")
    List<Article> findByIds(Long[] ids);

    /**
     * 根据标签名称查询文章中相关标签
     * @param tagName 标签名称
     * @return 标签对象
     */
    @Select("SELECT * FROM article WHERE tag = #{tagName}")
    Article findByName(String tagName);

    /**
     * 管理员根据关键词搜索文章
     * @param keyword 关键词
     * @param pageStart 页码
     * @param pageSize 每页数量
     * @return 文章列表
     */
    @Select("SELECT * FROM article WHERE title LIKE CONCAT('%', #{keyword}, '%') OR content LIKE CONCAT('%', #{keyword}, '%') LIMIT #{pageStart}, #{pageSize}")
    List<Article> adminSearchByKeyword(String keyword, int pageStart, int pageSize);

    /**
     * 管理员根据关键词搜索文章数量
     * @param keyword 关键词
     * @return 文章数量
     */
    @Select("SELECT COUNT(*) FROM article WHERE title LIKE CONCAT('%', #{keyword}, '%') OR content LIKE CONCAT('%', #{keyword}, '%')")
    long adminCountByKeyword(String keyword);
}
